package 栈.最小栈;

import java.util.Stack;
/**
 * 题目描述：
 * 设计一个支持 push ，pop ，top 操作，并能在常数时间内检索到最小元素的栈。
 * 实现 MinStack 类:
 * MinStack() 初始化堆栈对象。
 * void push(int val) 将元素val推入堆栈。
 * void pop() 删除堆栈顶部的元素。
 * int top() 获取堆栈顶部的元素。
 * int getMin() 获取堆栈中的最小元素。
 * 力扣链接：https://leetcode-cn.com/problems/min-stack/
 * 力扣：155. 最小栈
 * */
/**
 * 题目思路：
 * 利用辅助栈，将最小值放在辅助栈中
 * 注意点：
 * 弹出元素是要注意，弹出的元素主栈和最小栈元素相等时候弹出
 * */

class MinStack {
    private final Stack<Integer> stack;
    private final Stack<Integer> min_stack;

    public MinStack() {
        stack = new Stack<>();
        min_stack = new Stack<>();
    }
    
    public void push(int val) {
        stack.push(val);
        if(min_stack.isEmpty() || val <= min_stack.peek()){
            min_stack.push(val);
        }
    }
   // 只有主栈和最小值栈相等的时候才会弹出最小值栈的值
   // 为啥要这样做，因为要确保到时候弹出的元素是最小值栈的栈顶元素
    public void pop() {
        if(stack.pop().equals(min_stack.peek())){
            min_stack.pop();
        }
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int getMin() {
        return min_stack.peek();
    }
}